package ar.uade.edu.fain.ad.common.remote;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.Date;
import java.util.List;
import java.util.Set;

import ar.uade.edu.fain.ad.common.exception.FacturaYaPagadaException;
import ar.uade.edu.fain.ad.common.exception.PedidoCerradoException;
import ar.uade.edu.fain.ad.common.exception.PedidoFacturadoException;
import ar.uade.edu.fain.ad.common.exception.PedidoPendienteException;
import ar.uade.edu.fain.ad.common.transfer.CajaVO;
import ar.uade.edu.fain.ad.common.transfer.CierreCajaVO;
import ar.uade.edu.fain.ad.common.transfer.FacturaVO;
import ar.uade.edu.fain.ad.common.transfer.LocalVO;
import ar.uade.edu.fain.ad.common.transfer.MedioPagoVO;
import ar.uade.edu.fain.ad.common.transfer.PedidoVO;

public interface CajaServicioRemoto extends Remote {

	/**
	 * CU03. Lista los medios de pago.
	 * @return los medios de pago del sistema
	 * @throws RemoteException
	 */
	public abstract List<MedioPagoVO> buscarMediosPagoHabilitados()
			throws RemoteException;
	
	/**
	 * CU04. Lista pedidos para facturar.
	 * @param localVO 
	 * @return los pedidos del local que estan para facturar
	 * @throws RemoteException
	 */
	public abstract List<PedidoVO> buscarPedidosSinFactura(LocalVO localVO) 
			throws RemoteException;
	
	
	/**
	 * CU04. Factura un conjunto de pedidos.
	 * @param pedidoVO
	 * @return la factura generada
	 * @throws RemoteException
	 * @throws PedidoCerradoException
	 */
	public abstract FacturaVO facturar(CajaVO cajaVO, Set<PedidoVO> pedidoVOs)
			throws RemoteException, PedidoFacturadoException;

	/**
	 * CU03. Registra la factura como paga.
	 * @param facturaVO
	 * @param medioPagoVO
	 * @throws RemoteException
	 * @throws FacturaYaPagadaException
	 * 
	 */
	public abstract void registrarPago(
			FacturaVO facturaVO, MedioPagoVO medioPagoVO)
			throws RemoteException, FacturaYaPagadaException, 
					IllegalArgumentException;
	
	/**
	 * CU05. Impacta el calculo de comisiones para los mozos del local 
	 * en una fecha determinada.
	 * @param fecha 
	 * @param localVO
	 * @throws RemoteException
	 */
	public abstract void calcularComisiones(LocalVO localVO, Date fecha) 
			throws PedidoPendienteException, RemoteException; 
	
	/**
	 * CU06. Prepara los totales existentes en sistema para realizar cierre.
	 * @return los datos  del sistema recuperados para el cierre
	 * @throws RemoteException
	 * @throws PedidoPendienteException si aun hay pedidos pendientes
	 */
	public abstract CierreCajaVO prepararCierre(CajaVO cajaVO) 
			throws RemoteException, PedidoPendienteException;
	
	/**
	 * CU06. Realiza el cierre de caja.
	 * @param cierreCajaVO
	 * @throws PedidoPendienteException si existe un pedido aun abierto
	 * @throws RemoteException
	 */
	public abstract void confirmarCierre(CierreCajaVO cierreCajaVO) 
			throws RemoteException, PedidoPendienteException;
	
}
